/**
 * Slideshow Lite plugin for jQuery
 * 
 * v0.5.3
 * 
 * Copyright (c) 2009 Fred Wu
 * 
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 */

/**
 * Configuration options:
 * 
 * pauseSeconds float number of seconds between each photo to be displayed
 * fadeSpeed float number of seconds for the fading transition, the value should
 * not exceed 'pauseSeconds' width integer width of the slideshow, in pixels
 * height integer height of the slideshow, in pixels caption boolean display
 * photo caption? cssClass string name of the CSS class, defaults to
 * 'slideshowlite'
 */

(function($) {
	$.fn.slideshow = function(options) {

		var defaults = {
			pauseSeconds : 2,
			fadeSpeed : 0.5,
			width : 310,
			height : 120,
			caption : true,
			cssClass : 'slideshowlite'
		};

		var options = $.extend(defaults, options);

		// ----------------------------------------
		// slideshow objects and variables
		// ----------------------------------------

		var target = this;
		var items = $(target).children("a");
		var instance;

		// ----------------------------------------
		// some mandontory styling
		// ----------------------------------------

		if (!$(this).hasClass(options.cssClass))
			$(this).addClass(options.cssClass);

		$(this).css({
					width : options.width + "px",
					height : options.height + "px"
				});

		// ----------------------------------------
		// create anchor links to make the structure simpler for manupilation
		// ----------------------------------------

		$(this).children("img").wrap(document.createElement("a"));
		$(this).children("a").attr("target", "blank");

		// ----------------------------------------
		// add item sequence markups
		// ----------------------------------------

		var i = 1;
		$(this).children("a").each(function() {
					$(this).attr("rel", i++);
				});

		// ----------------------------------------
		// create pagination and caption
		// ----------------------------------------

		$(this).append("<ul></ul>");
		$(this).append("<ol></ol>");
		var pagination = $(this).children("ul");
		var caption = $(this).children("ol");

		var i = 1;
		var j = 0;
		$(this).children("a").each(function() {
			pagination.append("<li><a href=\"#\">" + i++ + "</a></li>");
			caption.append("<li>"
					+ $("#" + $(target).attr("id") + " img:nth(" + j++ + ")")
							.attr("alt") + "</li>");
		});
		pagination.fadeTo(0, 0.8);
		caption.fadeTo(0, 0.6);
		caption.hide();

		// ----------------------------------------
		// shortcuts
		// ----------------------------------------

		var firstItem = $(target).children("a:first");
		var lastItem = $(target).children("a:last");
		var currentItem = firstItem;

		// ----------------------------------------
		// pagination highlight
		// ----------------------------------------

		var paginationHighlight = function(sequence) {
			pagination.children("li").children("a").removeClass("current");
			pagination.children("li").children("a:nth(" + sequence + ")")
					.addClass("current");
		}

		// ----------------------------------------
		// caption
		// ----------------------------------------

		var showCaption = function(sequence) {
			caption.show();
			caption.children("li").hide();
			caption.children("li:nth(" + sequence + ")").fadeIn();
		}

		// ----------------------------------------
		// slideshow logic
		// ----------------------------------------

		var makeSlideshow = function() {

			// pagination click
			pagination.children("li").children("a").click(function() {
				if (!$(this).hasClass("current")) {
					// select the current item after the pagination click
					currentItem = $(target).children("a:nth("
							+ ($(this).text() - 1) + ")");

					currentItem.show();
					startSlideshow();
				}
			});

			// pagination highlight
			paginationHighlight(currentItem.attr("rel") - 1);

			// show caption
			if (options.caption == true) {
				showCaption(currentItem.attr("rel") - 1);
			}

			// show the current slide
			currentItem.fadeIn(options.fadeSpeed * 1000, function() {
						$(target).children("a").hide();
						$(this).show().css("z-index", 1);
					});

			// prepare for the next slide
			// determines the next item (or we need to rewind to the first
			// item?)
			if (currentItem.children("img").attr("src") == lastItem
					.children("img").attr("src")) {
				currentItem = firstItem;
				currentItem.css("z-index", 2);
			} else {
				currentItem = currentItem.next();
			}
		};

		var startSlideshow = function() {
			clearInterval(instance);
			makeSlideshow();
			instance = setInterval(makeSlideshow, options.pauseSeconds * 1000);
		};

		// ----------------------------------------
		// start the slideshow!
		// ----------------------------------------

		startSlideshow();
	};
})(jQuery);